//返回一个继承原型对象p属性的新对象
//如果ECMAScript5中的Object.create()存在的话调用它
//否则使用其他方法
function inherit(p){
	if(p == null)
    throw TypeError();
	if(Object.create)
    return Object.create(p);
  var t = typeof p;
  if(t !== "object" && t !== "function")
    throw TypeError();
  function f() {};
  f.prototype = p;
  return new f();
}

//把p中可枚举属性复制到o中，并返回o，如果属性名相同则o的属性被覆盖
function extend(o,p){
	for(prop in p){
		o[prop] = p[prop];
	}
	retrun o;
}

//创建指定类的子类
function define_subclass(superclass,		//父类构造函数
													constructor,	//新子类的构造函数
													methods,			//复制到原型中的实例方法
													statics)			//复制至构造函数中的类属性
{
	constructor.prototype = inherit(superclass.prototype);
	constructor.prototype.constructor = constructor;
	if(methods) extend(constructor.prototype,methods);
	if(statics) extend(constructor,statics);
	return constructor;
}

Function.prototype.extend = function(constructor,methods,statics){
	return define_subclass(this,constructor,methods,statics);
};
